// 引入其他的类
import Snake from "./Snake";
import Food from "./Food";
import ScorePanel from "./ScorePanel";

// 游戏控制器，控制其他的所有类
class GameControl {
    // 蛇
    snake: Snake;
    // 食物
    food: Food;
    // 记分牌
    scorePanel: ScorePanel;
    // 创建一个属性来存储蛇的移动方向（也就是按键的方向）
    direction: string = '';
    // 游戏是否停止
    isLive: boolean = true
    constructor() {
        this.snake = new Snake();
        this.food = new Food();
        this.scorePanel = new ScorePanel(10, 1);
        this.init();
    }

    // 游戏的初始化方法，调用后游戏即开始
    init() {
        // 绑定键盘按键按下的事件
        document.addEventListener('keydown', this.keydownHandler.bind(this));
        this.run()
    }

    /*
        Chrome       IE
        ArrowUp      Up
        ArrowDown    Down
        ArrowLeft    Left
        ArrowRight   Right
    */

    // 创建一个键盘按下的响应函数
    keydownHandler(event: KeyboardEvent) {
        // 需要检查event.key的值是否合法（用户是否按了正确的按键）
        // 修改direction属性
        this.direction = event.key;
    }
    // 蛇的移动
    run() {
        let x = this.snake.X
        let y = this.snake.Y

        switch (this.direction) {
            case 'ArrowUp':
                // if (y == 0) return alert("游戏结束")
                y -= 10
                break;
            case 'ArrowDown':
                // if (y == 290) return alert("游戏结束")
                y += 10
                break;
            case 'ArrowLeft':
                // if (x == 0) return alert("游戏结束")
                x -= 10
                break;
            case 'ArrowRight':
                // if (x == 290) return alert("游戏结束")
                x += 10
                break;
            case ' ':
                this.isLive = false
                break;
            default:
                break;
        }
        try {
            this.snake.X = x
            this.snake.Y = y
        } catch (e:any) {
            alert(e.message)
            this.isLive = false
        }

        this.isEat()  //判断是否吃到食物了
        this.isLive && setTimeout(this.run.bind(this), 300 - (this.scorePanel.level - 1) * 30)
    }
    // 判断是否吃到食物
    isEat() {

        if (this.snake.X == this.food.X && this.snake.Y == this.food.Y) {
            this.food.change()
            this.scorePanel.addScore()
            this.snake.addBody()

        }
    }
}

export default GameControl;